﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LeetCode.CodeDay
{
    public partial class Code
    {
        /// <summary>
        /// 整数转罗马数字
        /// I， V， X， L，C，D 和 M
        /// I             1
        /// V             5
        /// X             10
        /// L             50
        /// C             100
        /// D             500
        /// M             1000
        /// 例如， 罗马数字 2 写做 II ，即为两个并列的 1。12 写做 XII ，即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
        /// 通常情况下，罗马数字中小的数字在大的数字的右边。但也存在特例，例如 4 不写做 IIII，而是 IV。数字 1 在数字 5 的左边，所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地，数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况：
        /// I 可以放在 V(5) 和 X(10) 的左边，来表示 4 和 9。
        /// X 可以放在 L(50) 和 C(100) 的左边，来表示 40 和 90。 
        /// C 可以放在 D(500) 和 M(1000) 的左边，来表示 400 和 900。
        /// 给你一个整数，将其转为罗马数字
        /// </summary>
        /// <returns></returns>
        public string GetUnit(int source)
        {
            if (specialList.ContainsKey(source))
                return specialList[source];
            string result = string.Empty;
            var ct = GetCountAndText(source);
            for (int i = 0; i < ct.count; i++)
            {
                result += ct.text;
            }
            if (ct.more > 0)
                result += GetUnit(ct.more);
            return result;
        }
        public  (int count, string text, int more) GetCountAndText(int source)
        {
            int count = 0;
            string text = string.Empty;
            int more = 0;
            if (source >= 1000)
            {
                count = source / 1000;
                text = "M";
                more = source % 1000;
            }
            else if (source >= 500)
            {
                count = source / 500;
                text = "D";
                more = source % 500;
                if (specialList.ContainsKey(source / 100 * 100))
                {
                    count = 1;text = specialList[source / 100 * 100];more = source % 100;
                }
            }
            else if (source >= 100)
            {
                count = source / 100;
                text = "C";
                more = source % 100;
                if (specialList.ContainsKey(source / 100 * 100))
                {
                    count = 1; text = specialList[source / 100 * 100]; more = source % 100;
                }
            }
            else if (source >= 50)
            {
                count = source / 50;
                text = "L";
                more = source % 50;
                if (specialList.ContainsKey(source / 10 * 10))
                {
                    count = 1; text = specialList[source / 10 * 10]; more = source % 10;
                }
            }
            else if (source >= 10)
            {
                count = source / 10;
                text = "X";
                more = source % 10;
                if (specialList.ContainsKey(source / 10 * 10))
                {
                    count = 1; text = specialList[source / 10 * 10]; more = source % 10;
                }
            }
            else if (source >= 5)
            {
                count = source / 5;
                text = "V";
                more = source % 5;
                if (specialList.ContainsKey(source))
                {
                    count = 1; text = specialList[source]; more = 0;
                }
            }
            else if (source >= 1)
            {
                count = source;
                text = "I";
                more = 0;
                if (specialList.ContainsKey(source))
                {
                    count = 1; text = specialList[source]; more = 0;
                }
            }
            return (count, text, more);
        }
        public IDictionary<int, string> specialList => new Dictionary<int, string>
        {
            { 4,"IV"},{ 9,"IX"},{ 40,"XL"},{ 90,"XC"},{ 400,"CD"},{ 900,"CM"},
        };
    }
}
